// 作用：统一负责操作数据库表的一个帮助类
import cloud from '@hw-agconnect/cloud'
import { Database } from '@hw-agconnect/cloud/src/main/ets/database/Database'
// @ts-ignore
import schema from '../../resources/rawfile/schema.json'

// 导入相关数据库表的所有对象实例
// import { qtype, chaplist, chaplog, chapqa, chapqalog, userHeadImg } from '../models'
import { qtype } from '../models/qtype'
import { chaplist } from '../models/chaplist'
import { chaplog } from '../models/chaplog'
import { chapqa } from '../models/chapqa'
import { chapqalog } from '../models/chapqalog'
import { userHeadImg } from '../models/userHeadImg'

// 定义相关的数据操作方法
export class DatabaseHelper {
  // 初始化database
  static database: Database = cloud.database({ objectTypeInfo: schema, zoneName: 'hmqaZone' }) // dbZone是在AGC中的存储区名称

  // 定义查询qtype的方法,查询出所有数据
  static async aTypeQuery(): Promise<qtype[]> {
    return await DatabaseHelper.database.collection(qtype)
      .query()
      .get()
  }

  // 根据项目的实际情况编写其它数据库操作方法
  // 新增或更新用户头像(userHeadImg数据库表操作)
  static async userHeadImgUpsert(imageArr: userHeadImg[]): Promise<number> {
    return await DatabaseHelper.database.collection(userHeadImg)
      .upsert(imageArr)
  }

  // 定义查询chaplist的方法，根据题库分类id获取其下面的所有章节数据，并且按照order进行升序排列
  static async chaplistQuery(qTypeId: number): Promise<chaplist[]> {
    return await DatabaseHelper.database.collection(chaplist)
      .query()
      .equalTo('qid', qTypeId)
      .orderByAsc('order')
      .get()
  }

  // 根据章节id获取其下的所有题目数据，按照order字段进行升序排列
  static async quizListQuery(cId: number): Promise<chapqa[]> {
    return await DatabaseHelper.database.collection(chapqa)
      .query()
      .equalTo('cid', cId)
      .orderByAsc('order')
      .get()
  }

  // 查询当前用户的做题答案
  // cqaId:考题id，uId：当前登录用户id -> 获取当前用户当前题目的答题数据
  static async chapQaLogQueryUserSelectAnswer(cqaId: number, uId: string): Promise<chapqalog[]> {
    return await DatabaseHelper.database.collection(chapqalog)
      .query()
      .equalTo('cqaid', cqaId)
      .and()
      .equalTo('uid', uId)
      .get()
  }

  // cId:考卷id，uId：当前登录用户id -> 获取当前用户对应考卷的所有答题数据，按照cqaid字段进行升序排列
  static async chapQaLogQueryUserSelectAllAnswer(cId: number, uId: string): Promise<chapqalog[]> {
    return await DatabaseHelper.database.collection(chapqalog)
      .query()
      .equalTo('cid', cId)
      .and()
      .equalTo('uid', uId)
      .orderByAsc('cqaid')
      .get()
  }

  // 新增或者更新章节题目做题答案
  static async chapQaLogUpsert(objArray: chapqalog[]): Promise<number> {
    return await DatabaseHelper.database.collection(chapqalog)
      .upsert(objArray)
  }

  // 新增或者更新章节信息
  static async chapLogUpsert(objArray: chaplog[]): Promise<number> {
    return await DatabaseHelper.database.collection(chaplog)
      .upsert(objArray)
  }

  // 根据主键cid获取试卷数据
  static async chapListQueryByCid(cId: number): Promise<chaplist[]> {
    return await DatabaseHelper.database.collection(chaplist)
      .query()
      .equalTo("cid", cId)
      .get()
  }

  // 获取章节试卷信息
  static async chapLogQuery(cId: number, uId: string): Promise<chaplog[]> {
    return await DatabaseHelper.database.collection(chaplog)
      .query()
      .equalTo("cid", cId)
      .and()
      .equalTo("uid", uId)
        // .orderByDesc('score') // 降序排列时，则显示最高分
      .get()
  }

  // 根据uid数据获取他们的头像
  static async userHeadImgQueryByUid(uIds: string[]): Promise<userHeadImg[]> {
    return await DatabaseHelper.database.collection(userHeadImg)
      .query()
      .In('uid', uIds)
      .get()
  }

  // 获取首页排行榜数据
  static async homeQueryByPage(pageIndex: number, pageSize: number = 6): Promise<chaplog[]> {
    let limitCount = (pageIndex - 1) * pageSize
    return await DatabaseHelper.database.collection(chaplog)
      .query()
      .orderByDesc('score')
      .limit(pageSize, limitCount)
      .get()
  }

  // 获取用户章节试卷做题信息
  static async chapLogQueryByQidUid(qId: number, uId: string): Promise<chaplog[]> {
    return await DatabaseHelper.database.collection(chaplog)
      .query()
      .equalTo('qid', qId)
      .and()
      .equalTo('uid', uId)
        // .orderByDesc('score') // 降序排列时，则显示最高分
      .get()
  }

  // 获取用户所做的试卷
  static async chapLogQueryByUid(uId: string): Promise<chaplog[]> {
    return await DatabaseHelper.database.collection(chaplog)
      .query()
      .equalTo('uid', uId)
      .get()
  }

  // 重置时
  // 删除表chaplog数据 条件：cid && uid
  static async chapLogDelete(list: chaplog[]) {
    return await DatabaseHelper.database.collection(chaplog)
      .delete(list)
  }

  // 删除表chapqalog数据 条件：cid && uid
  static async chapQaLogDelete(list: chapqalog[]) {
    return await DatabaseHelper.database.collection(chapqalog)
      .delete(list)
  }
}